//
//  S.swift
//  Documentation
//
//  Created by Toj on 11/13/23.
//

import UIKit

extension Calendar {
    
    /// Calendar支持多种不同的日历. 每个都有一个标识符.
    public enum Identifier : Sendable {
        /// 欧洲、西半球和其他地方的共同历法
        
        /// 公历
        case gregorian
        /// 佛历
        case buddhist
        /// 农历
        case chinese
        /// 科普特历
        case coptic
        /// 埃塞俄比亚历
        case ethiopicAmeteMihret
        /// 埃塞俄比亚阿米特阿莱姆日历
        case ethiopicAmeteAlem
        /// 希伯来历
        case hebrew
        /// 国际标准历法
        case iso8601
        /// 印度国定历
        case indian
        /// 伊斯兰历
        case islamic
        /// 伊斯兰希吉来日历
        case islamicCivil
        /// 和历
        case japanese
        /// 波斯历
        case persian
        /// 民国纪年
        case republicOfChina
        
        /// 伊斯兰天文历
        /// 使用公元622年7月15日星期四历的简单的伊斯兰表格历法
        @available(macOS 10.10, iOS 8.0, *)
        case islamicTabular
        
        /// 伊斯兰历(乌姆库拉)
        /// 沙特阿拉伯使用的伊斯兰教Umm al-Qura日历.
        /// 这是基于天文计算, 而不是表格行为.
        @available(macOS 10.10, iOS 8.0, *)
        case islamicUmmAlQura
        
        public static func == (a: Calendar.Identifier, b: Calendar.Identifier) -> Bool
        public func hash(into hasher: inout Hasher)
        public var hashValue: Int { get }
    }
    
    ///日历日期的各个组成部分的枚举.
    public enum Component : Sendable {
        /// 纪元
        case era
        /// 年
        case year
        /// 月
        case month
        /// 日
        case day
        /// 时
        case hour
        /// 分
        case minute
        /// 秒
        case second
        /// 周几
        case weekday
        /// 本月的第几个周几
        case weekdayOrdinal
        /// 季度
        case quarter
        /// 一个月的周数
        case weekOfMonth
        /// 一年的周数
        case weekOfYear
        /// ISO8601标准下的年份
        case yearForWeekOfYear
        /// 纳秒
        case nanosecond
        /// 日历
        case calendar
        /// 时区
        case timeZone
        
        public static func == (a: Calendar.Component, b: Calendar.Component) -> Bool
        public func hash(into hasher: inout Hasher)
        public var hashValue: Int { get }
    }
}

extension Calendar {
    
    /// 查询方向
    public enum SearchDirection : Sendable {
        /// 向日期 更大 的方向查询
        case forward
        /// 向日期 更小 的方向查询
        case backward
        
        public static func == (a: Calendar.SearchDirection, b: Calendar.SearchDirection) -> Bool
        public func hash(into hasher: inout Hasher)
        public var hashValue: Int { get }
    }
    
    /// 结果选择策略
    public enum RepeatedTimePolicy : Sendable {
        /// 有多个匹配结果时, 将返回第一个结果
        case first
        /// 有多个匹配结果时, 将返回最后一个结果
        case last
        
        public static func == (a: Calendar.RepeatedTimePolicy, b: Calendar.RepeatedTimePolicy) -> Bool
        public func hash(into hasher: inout Hasher)
        public var hashValue: Int { get }
    }
    
    /// 匹配策略
    public enum MatchingPolicy : Sendable {
        /// 如果DateComponents的下一个更高组件没有匹配的时间, 算法将返回存在的现有时间.
        /// e.g..: 在夏令时过渡时间可能没有2:37 am, 那么结果将是3:00 am.
        case nextTime
        
        /// 与nextTime相同, 但会保留下一个组件值.
        /// e.g..: 在夏令时过渡时间可能没有2:37 am, 那么结果将是3:37 am.
        case nextTimePreservingSmallerComponents
        
        /// 与nextTime相同, 但会减小组件值和保留下一个组件值.
        /// e.g..: 在夏令时过渡时间可能没有2:37am, 那么结果将是1:37am.
        case previousTimePreservingSmallerComponents
        
        /// 精确查询匹配项
        /// e.g..: 在公历中搜索2月29日, 上面的三个枚举选项可能改为选择3月1日(如果年份不是闰年)
        case strict
        
        public static func == (a: Calendar.MatchingPolicy, b: Calendar.MatchingPolicy) -> Bool
        public func hash(into hasher: inout Hasher)
        public var hashValue: Int { get }
    }
}
